# -*- coding: utf-8 -*-
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#作者：cacho_37967865
#博客：https://blog.csdn.net/sinat_37967865
#文件：pandas_model.py
#日期：2019-09-06
#备注：pandas 是基于NumPy 的一种工具，该工具是为了解决数据分析任务而创建的,主要数据结构为两个类：
DataFrame: 可以理解为表格，类似于Excel的表格 pandas.core.frame.DataFrame
Series: 表示单列。DataFrame包含多个列，即多个Series，每个Series都有名称。pandas.core.series.Series
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
import pandas as pd
import numpy as np

# 创建一个pandas对象
def pandas_create():
    df = pd.DataFrame({"id": [1001, 1002, 1003, 1004, 1005, 1006],
                       "date": pd.date_range('20130102', periods=6),
                       "city": ['Beijing ', 'SH', ' guangzhou ', 'Shenzhen', 'shanghai', 'BEIJING '],
                       "age": [23, 44, 54, 32, 34, 32],
                       "category": ['100-A', '100-B', '110-A', '110-C', '210-A', '130-F'],
                       "price": [1200, np.nan, 2133, 5433, np.nan, 4432]},
                      columns=['id', 'date', 'city', 'category', 'age', 'price'])
    #print(df,'\n')
    return df

# 查看信息
def pandas_show(df):
    print(type(df))
    print('查看数据表基本信息：',type(df.info),'\n',df.info)
    print('查看维度元组tuple(行数、列数)：',df.shape)
    print('查看每一列数据的格式：',type(df.dtypes),'\n',df.dtypes)
    print('查看某一列值和数据类型：','\n',df['price'])
    print('查看数据表的值:',type(df.values),'\n',df.values)
    print('查看默认前5行数据:','\n',df.head(10))
    print('查看默认后5行数据:','\n',df.tail())
    print('查看id列中最大值对应的索引：', '\n', df.id.idxmax(0))       # 只针对数值类型
    #print('显示所有列最大值所对应的索引：', '\n', df.idxmax(0))

    print('统计信息展示:','\n',df.describe())
    print('统计每一列有多少缺失值：', '\n', df.isnull().sum())
    print('统计每一列非空个数:', '\n', df.count())
    print('统计某列是否有重复数据:', '\n', df.age.is_unique)          # false有重复数据

    print('按列的值排序：', '\n', df.sort_values(by='age'))
    print('按顺序进行多列降序排序：', '\n', df.sort_values(['age','category'],ascending=False))

    print('选择多列数据：', '\n', df[['id','price']])
    print('选择行数据通过切片获取：', '\n', df[0:3])
    print('选择行数据通过一个单独列的值来筛选：', '\n', df[df.age > 32])

    print('行和列转置：', '\n', df.T)

    print('统计每一列(数字类型)平均值：', '\n', df.mean())
    print('统计每一列(数字类型)平均值取整：', '\n', round(df.mean()))
    print('统计每一行(数字类型)平均值：', '\n', df.mean(1))

# inplace = True时会改变旧的DataFrame
def pandas_deal(df):
    #print('删除列改变原来数据：','\n',df.drop('price', axis = 1, inplace = True))
    print('删除列不改变原来数据：','\n',df.drop('price', axis = 1))
    print('删除所有均为空值的行：', '\n', df.dropna(how='all'))
    print('删除包含缺失值的行：','\n',df.dropna())
    print('填充所有空值(NaN)用数字0：','\n',df.fillna(value=0))
    print('填充某一列空值(NaN)用数字0：','\n',df.price.fillna(value=0))
    print('填充某一列空值(NaN)用price均值：','\n',df['price'].fillna(df['price'].mean(),inplace = True))
    print('修改某个字段的值替换：','\n',df['city'].replace('SH', 'shanghai',inplace = True))
    print('修改某个字段的值大小写转换','\n',df['city'].str.lower())
    print('修改某一列的数据格式：','\n',df['age'].astype(float))

    print('表格值：','\n',df)


# 先做删除和增加操作，最后做修数操作
def clear_data(df):
    df.to_csv('excel_to_python.csv')

def excel_data(df):
    df.to_excel('excel_to_python.xls',sheet_name='sheet', index=False)

# 更改数据类型
def change_data_type():
    excel_df['blacklistValue'] = excel_df['blacklistValue'].astype(str)
    excel_df['beginDate'] = excel_df['beginDate'].replace('/', '-').apply(pd.to_datetime)
    excel_df['endDate'] = excel_df['endDate'].replace('/', '-').apply(pd.to_datetime)
    print(excel_df[['beginDate','endDate']])
    #print(excel_df['endDate'])
    #excel_df.to_excel('excel_to_python.xls',sheet_name='sheet', index=False)

if __name__ == '__main__':
    excel_df = pd.read_excel('E:\zenglingwei\\test\\5.xlsx')  # dtype='str'
    #df = pandas_create()
    change_data_type()
    #pandas_show(df)
    #pandas_deal(df)

    #clear_data(df1)

